#include "doubly_linked_list.h"

ENQ_ANCHOR_p_t ENQ_create_list(const char *name)
{
    ENQ_ANCHOR_p_t list = CDA_NEW(ENQ_ANCHOR_t);

    list->flink = list;
    list->blink = list;
    list->name = CDA_NEW_STR_IF(name);

    return list;
}

ENQ_ITEM_p_t ENQ_create_item(const char *name, size_t size)
{
    ENQ_ITEM_p_t item = (ENQ_ITEM_p_t)CDA_malloc(size);

    CDA_ASSERT(size >= sizeof(ENQ_ITEM_t));
    item->flink = item;
    item->blink = item;
    item->name = CDA_NEW_STR_IF(name);

    return item;
}

CDA_BOOL_t ENQ_is_item_enqed(ENQ_ITEM_p_t item)
{
    CDA_BOOL_t rcode = (item->flink == item ? CDA_FALSE : CDA_TRUE);
    return rcode;
}

CDA_BOOL_t ENQ_is_list_empty(ENQ_ANCHOR_p_t list)
{
    return (list->flink == list) && (list->blink == list);
}

ENQ_ITEM_p_t ENQ_add_head(ENQ_ANCHOR_p_t list, ENQ_ITEM_p_t item)
{
    item->blink = list->blink;
    list->blink = item;
}